package py.com.sole.solesys;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.beanutils.BeanUtils;
import org.primefaces.context.RequestContext;

import org.primefaces.event.SelectEvent;

import py.com.sole.dao.DaoFactory;
import py.com.sole.model.Alumno;
import py.com.sole.model.Direccion;
import py.com.sole.model.Institucion;
import py.com.sole.model.Padre;
import py.com.sole.model.TipoDocumento;

@ManagedBean
@SessionScoped
/**
 *
 */
public class AlumnoBean extends Persona implements Serializable {

  /**
   *
   */
  private static final long serialVersionUID = 1L;
  private Institucion institucion;
  private PadreBean padre;
  private Padre padreModel;
  private List<PadreBean> padres;
  private List<Padre> padreList;
  private List<Padre> padreListSearch;
  private List<Alumno> alumnos;
  private Alumno alumnoSelected;
  private Direccion direccionModel;
  private TipoDocumento tipoDocu;
  private Alumno alumno;
  private py.com.sole.model.Persona perAlumno;
  private Padre padreTemp;
  private py.com.sole.model.Persona perTemp;
  private Direccion dirTemp;
  private boolean activeBtnEditar;

  public AlumnoBean() {
    padres = new ArrayList<PadreBean>();
    padreModel = new Padre();
    alumnos = DaoFactory.getAlumno().getAlumnos();
    if (padreList == null) {
      padreList = new ArrayList<Padre>();
    }
    padreListSearch = new ArrayList<Padre>();
    padre = new PadreBean();
    perAlumno = new py.com.sole.model.Persona();
    alumnoSelected = new Alumno();
    direccionModel = new Direccion();
    tipoDocu = new TipoDocumento();
    alumno = new Alumno();
    institucion = new Institucion();
    perTemp = new py.com.sole.model.Persona();
    padreTemp = new Padre();
    dirTemp = new Direccion();
  }

  @PostConstruct
  private void init() {

  }

  /**
   * Guarda el alumno.
   *
   * @return
   */
  public String save() {
    alumnoSelected = new Alumno();
    tipoDocu = this.getTipoDocu();
    direccionModel.setDescripcion(this.getDireccion());
    direccionModel.setCiudad(this.getCiudad());
    perAlumno.setNombre(this.getNombre());
    perAlumno.setApellido(this.getApellido());
    perAlumno.setDireccion(direccionModel);
    perAlumno.setSexo('F');//this.getSexo().charAt(0));
    perAlumno.setEmail(this.getEmail());
    perAlumno.setTelefono(this.getTelefono());
    perAlumno.setTipoDocumentoId(this.getTipoDocumento());
    perAlumno.setDocumento(this.getDocumento());
    perAlumno.setFechaNac(fechaNac);
    alumnoSelected.setInstitucion(this.institucion);
    alumnoSelected.setPersona(perAlumno);

    alumnoSelected.setPadreList(padreList);

    DaoFactory.getAlumno().addAlumno(alumnoSelected);
    alumnos = DaoFactory.getAlumno().getAlumnos();
    return clear();
  }

  /**
   * Limpia las variables del Bean.
   *
   * @return
   */
  public String clear() {
    padres = new ArrayList<PadreBean>();
    alumnoSelected = new Alumno();
    activeBtnEditar = false;
    padreModel = new Padre();
    padre = new PadreBean();
    padreList = new ArrayList<Padre>();
    padres = new ArrayList<PadreBean>();
    this.clearPersona();
    return "list_alumno";
  }

  /**
   * Agrega un padre nuevo.
   */
  public void newPadre() {
    try {
      padreList.size();
      PadreBean p = (PadreBean) BeanUtils.cloneBean(padre);
      this.padres.add(p);
      dirTemp.setDescripcion(p.getDireccion());
      dirTemp.setCiudad(p.getCiudad());
      perTemp.setDireccion(dirTemp);
      perTemp.setTipoDocumentoId(DaoFactory.getTipoDocumento().getTipoDocumentoById(1));
      perTemp.setNombre(p.getNombre());
      perTemp.setApellido(p.getApellido());
      perTemp.setEmail(p.getEmail());
      perTemp.setTelefono(p.getTelefono());
      padreTemp.setPersona(perTemp);
      padreList.add(padreTemp);
    } catch (IllegalAccessException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvocationTargetException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchMethodException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    }

  }

  /**
   * Agrega un nuevo padre desde el formulario ADD.
   */
  public void addPadres() {
    PadreBean p = new PadreBean();
    p.setNombre(padreModel.getPersona().getNombre());
    p.setApellido(padreModel.getPersona().getApellido());
    p.setCiudad(padreModel.getPersona().getDireccion().getCiudad());
    p.setTelefono(padreModel.getPersona().getTelefono());
    p.setEmail(padreModel.getPersona().getEmail());
    try {
      this.padres.add((PadreBean) BeanUtils.cloneBean(p));
    } catch (IllegalAccessException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvocationTargetException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchMethodException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    }
  }

  public void addPadresFromBean() {
    try {
      PadreBean p = (PadreBean) BeanUtils.cloneBean(padre);
      this.padres.add(p);
      this.padreList.add(DaoFactory.getPadre().getPadreById(padre.getId()));
    } catch (IllegalAccessException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvocationTargetException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchMethodException ex) {
      Logger.getLogger(AlumnoBean.class.getName()).log(Level.SEVERE, null, ex);
    }
  }

  /**
   * Selecciona el alumno en la grilla actual
   *
   * @param event
   */
  public void onRowAlumno(SelectEvent event) {
    alumnoSelected = (Alumno) event.getObject();
    activeBtnEditar = true;
    this.setNombre(alumnoSelected.getPersona().getNombre());
    this.setApellido(alumnoSelected.getPersona().getApellido());
    this.setTipoDocumento(alumnoSelected.getPersona().getTipoDocumentoId());
    this.setDocumento(alumnoSelected.getPersona().getDocumento());
    this.setSexo(alumnoSelected.getPersona().getSexo().toString());
    this.setFechaNac(alumnoSelected.getPersona().getFechaNac());
    this.setTelefono(alumnoSelected.getPersona().getTelefono());
    this.setDireccion(alumnoSelected.getPersona().getDireccion().getDescripcion());
    this.setCiudad(alumnoSelected.getPersona().getDireccion().getCiudad());
    this.setInstitucion(alumnoSelected.getInstitucion());
    padreList = alumnoSelected.getPadreList();
  }

  /**
   * Remueve el un padre desde la lista de padres.
   *
   * @param padre
   */
  public void removePadre(Padre padre) {
    padreList.remove(padre);
  }

  public void onRowPadre(SelectEvent event) {
    this.padreModel = (Padre) event.getObject();
    this.padres = new ArrayList<PadreBean>();
    boolean pf = true;
    PadreBean p = new PadreBean();
    p.setId(padreModel.getId());
    p.setNombre(padreModel.getPersona().getNombre());
    p.setApellido(padreModel.getPersona().getApellido());
    p.setCiudad(padreModel.getPersona().getDireccion().getCiudad());
    p.setTelefono(padreModel.getPersona().getTelefono());
    p.setEmail(padreModel.getPersona().getEmail());
    for (Padre padreBean : padreList) {
      if (padreBean.getId() == p.getId()) {
        pf = false;
        break;
      }
    }
    if (pf) {
      this.padres.add(padres.size(), p);
      padreList.add(padreModel);
    }

    RequestContext.getCurrentInstance().execute("dlgPadresList.hide()");
  }

  public void searchPadres() {
    List<Padre> padresTemp = DaoFactory.getPadre().getPadreByFilter(padre.getTipoDocumento(), padre.getNombre(), padre.getApellido(), padre.getDocumento());

    if (padresTemp.isEmpty()) {
      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Resultado de la consulta", "No se encontraron registros");
      FacesContext.getCurrentInstance().addMessage(null, message);
      RequestContext.getCurrentInstance().execute("searchPadres.hide();");
      RequestContext.getCurrentInstance().update(":alumno-form:pnlPadres:growl");
      RequestContext.getCurrentInstance().update("padresList");
    } else if (padresTemp.size() == 1) {
      padre.setId(padresTemp.get(0).getId());
      padre.setNombre(padresTemp.get(0).getPersona().getNombre());
      padre.setApellido(padresTemp.get(0).getPersona().getApellido());
      padre.setDireccion(padresTemp.get(0).getPersona().getDireccion().getDescripcion());
      padre.setCiudad(padresTemp.get(0).getPersona().getDireccion().getCiudad());
      padre.setTipoDocumento(padresTemp.get(0).getPersona().getTipoDocumentoId());
      padre.setTelefono(padresTemp.get(0).getPersona().getTelefono());
      padre.setEmail(padresTemp.get(0).getPersona().getEmail());
      if (!this.padreList.contains(padresTemp.get(0))) {
        this.padreList.add(padresTemp.get(0));
      }
      try {
        padres.add((PadreBean) BeanUtils.cloneBean(padre));
      } catch (Exception e) {

      }
      RequestContext.getCurrentInstance().execute("searchPadres.hide();");
      RequestContext.getCurrentInstance().update("padres-form:padrePanelGrid");
      RequestContext.getCurrentInstance().update("alumno-form:pnlPadres");
    } else {
      this.padreListSearch = padresTemp;
      RequestContext.getCurrentInstance().update("padresList");
      RequestContext.getCurrentInstance().execute("dlgPadresList.show();");
      RequestContext.getCurrentInstance().execute("searchPadres.hide();");
    }
  }

  /**
   * Elimina el alumno seleccionado
   */
  public void borrarAlumno() {
    FacesMessage message;
    if (DaoFactory.getAlumno().deleteAlumno(alumnoSelected.getId())) {
      alumnos = DaoFactory.getAlumno().getAlumnos();
      alumnoSelected = new Alumno();
      activeBtnEditar = false;
      message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Acción Eliminar", "El alumno se borró satisfactoriamente");
      FacesContext.getCurrentInstance().addMessage(null, message);
    } else {
      message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Acción Eliminar", "Ocurrió un problema al eliminar el alumno");
      FacesContext.getCurrentInstance().addMessage(null, message);
    }

  }

  public Institucion getInstitucion() {
    return institucion;
  }

  public void setInstitucion(Institucion institucion) {
    this.institucion = institucion;
  }

  public List<PadreBean> getPadres() {
    return padres;
  }

  public void setPadres(List<PadreBean> padres) {
    this.padres = padres;
  }

  //Getters && Setters
  public PadreBean getPadre() {
    return padre;
  }

  public void setPadre(PadreBean padre) {
    this.padre = padre;
  }

  public Padre getPadreModel() {
    return padreModel;
  }

  public void setPadreModel(Padre padreModel) {
    this.padreModel = padreModel;
  }

  public List<Alumno> getAlumnos() {
    return alumnos;
  }

  public void setAlumnos(List<Alumno> alumnos) {
    this.alumnos = alumnos;
  }

  public List<Padre> getPadreList() {
    return padreList;
  }

  public void setPadreList(List<Padre> padreList) {
    this.padreList = padreList;
  }

  public Alumno getAlumnoSelected() {
    return alumnoSelected;
  }

  public void setAlumnoSelected(Alumno alumnoSelected) {
    this.alumnoSelected = alumnoSelected;
  }

  public Direccion getDireccionModel() {
    return direccionModel;
  }

  public void setDireccionModel(Direccion direccionModel) {
    this.direccionModel = direccionModel;
  }

  public TipoDocumento getTipoDocu() {
    return tipoDocu;
  }

  public void setTipoDocu(TipoDocumento tipoDocu) {
    this.tipoDocu = tipoDocu;
  }

  public Alumno getAlumno() {
    return alumno;
  }

  public void setAlumno(Alumno alumno) {
    this.alumno = alumno;
  }

  public py.com.sole.model.Persona getPerAlumno() {
    return perAlumno;
  }

  public void setPerAlumno(py.com.sole.model.Persona perAlumno) {
    this.perAlumno = perAlumno;
  }

  public List<Padre> getPadreListSearch() {
    return padreListSearch;
  }

  public void setPadreListSearch(List<Padre> padreListSearch) {
    this.padreListSearch = padreListSearch;
  }

  public Padre getPadreTemp() {
    return padreTemp;
  }

  public void setPadreTemp(Padre padreTemp) {
    this.padreTemp = padreTemp;
  }

  public py.com.sole.model.Persona getPerTemp() {
    return perTemp;
  }

  public void setPerTemp(py.com.sole.model.Persona perTemp) {
    this.perTemp = perTemp;
  }

  public Direccion getDirTemp() {
    return dirTemp;
  }

  public void setDirTemp(Direccion dirTemp) {
    this.dirTemp = dirTemp;
  }

  public boolean isActiveBtnEditar() {
    return activeBtnEditar;
  }

  public void setActiveBtnEditar(boolean activeBtnEditar) {
    this.activeBtnEditar = activeBtnEditar;
  }

}
